#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>

//int main()
//{
//	//野指针
//	// 1.未初始化
//	//int* p;	//p是一个局部的指针变量，局部变量不初始化的化，默认是随机值
//	//*p = 20;	//非法访问内存
//	// 
//	//2.越界访问
//	//int arr[10] = { 0 };
//	//int* p = arr;
//	//for (int i = 0; i <= 10; i++)
//	//{
//	//	*p = i;
//	//	p++;
//	//}
//	
//	return 0;
//}

//3.指针指向的空间被释放
//test() {
//	int a = 10;
//	return &a;
//}
//
//int main()
//{
//	int* p = test();
//	*p = 20;
//
//	return 0;
//}

//指针初始化
//小心越界，C语言本身是不会检查数组的越界行为的
//空间释放置为NULL
//使用之前检查有效性
//int main()
//{
//	//当前不知道p应该初始化为什么，直接初始化为NULL
//	int* p = NULL;
//	if (p != NULL)
//	{
//		*p = 10;
//	}
//	
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = arr;
//	int* pend = arr + 10;
//	while (p < pend)
//	{
//		printf("%d\n", *p);
//		p++;
//	}
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//指针相减的前提是两个指针指向同一块空间
//	printf("%lld\n", &arr[9] - &arr[0]);	//指针减去指针得到的是两个指针之间的元素个数
//
//	return 0;
//}

//计数器
//int my_strlen(char* str)
//{
//	int count = 0;
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}
//递归
//指针 - 指针
//int my_strlen(char* str)
//{
//	char* start = str;
//	while (*str != '\0')
//	{
//		str++;
//	}
//	return str - start;
//}
//int main()
//{
//	//strlen() - 求字符串长度
//	int len = my_strlen("abc");
//	printf("%d\n", len);
//}

//int main()
//{
//	int arr[10] = { 0 };
//	printf("%p\n",arr);	//数组名是数组首元素的地址
//	printf("%p\n", &arr[0]);
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int* p = arr;
//	for (int i = 0; i < 10; i++)
//	{
//		*(p + i) = i;
//		printf("%d\n", arr[i]);
//	}
//	
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = arr;	//数组名
//	//[] 是一个操作符，2和arr是两个操作数
//	printf("%d\n", 2[arr]);
//	printf("%d\n", p[2]);
//	//arr[2] <==> *(arr+2) *(p+2) <==> *(2+p) <==> *(2+arr) <==> 2[arr]
//
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int* pa = &a;	//pa是指针变量，一级指针
//
//	//ppa是一个二级指针变量
//	int** ppa = &pa;	//pa也是个变量，&pa取出pa在内存中起始地址
//}

//指针数组
//int main()
//{
//	int arr[10];	//整型数组 - 存放整型的数组
//	char ch[5];		//字符数组
//	int* parr[5];	//整型指针的数组
//
//	return 0;
//}

//struct B
//{
//	char c;
//	short s;
//	double d;
//};
//
//struct Stu
//{
//	//成员变量
//	struct B b;
//	char name[20];	//名字
//	int age;	//年龄
//	char id[20];	//学号
//}s1, s2;	//s1和s2也是结构体变量，是全局变量
//
//int main()
//{
//	//s是局部变量
//	struct Stu s = { {'w', 20, 3.14}, "张三", 30, "20200534" };	//对象
//	//. ->
//	//printf("%c\n", s.b.c);
//	//printf("%s\n", s.id);
//
//	struct Stu* ps = &s;
//	printf("%c\n", (*ps).b.c);
//	printf("%c\n", ps->b.c);
//
//	return 0;
//}

//struct B
//{
//	char c;
//	short s;
//	double d;
//};
//
//struct Stu
//{
//	//成员变量
//	struct B b;
//	char name[20];	//名字
//	int age;	//年龄
//	char id[20];	//学号
//};
//
//void print1(struct Stu t)
//{
//	printf("%c %d %lf %s %d %s\n", t.b.c, t.b.s, t.b.d, t.name, t.age, t.id);
//}
//
//void print2(struct Stu* ps)
//{
//	printf("%c %d %lf %s %d %s\n", ps->b.c, ps->b.s, ps->b.d, ps->name, ps->age, ps->id);
//}
//
//int main()
//{
//	//s是局部变量
//	struct Stu s = { {'w', 20, 3.14}, "张三", 30, "20200534" };	//对象
//	//写一个函数打印s的内容
//	print1(s);	//传值调用
//	print2(&s);	//传址调用，推荐
//
//	return 0;
//}
//函数调用的参数压栈：
// 栈，是一种数据结构
// 先进后出
// 压栈：最上层放元素
// 出栈：最上层删元素
//函数栈帧的创建和销毁
